let callback = [];
let pendding = false;
let timerFunc = null;
function flush() {
  // callback.forEach(cb => cb());
  callback.forEach(function(cb) {
    cb();
  });
  pendding = false;
}

if (Promise) {
  timerFunc = () => {
    // 虽然这里的是一个直接完成的Promise，但是then里面的函数是被放入异步微任务队列的，所有比主线程的同步任务晚
    Promise.resolve().then(flush);
  }
} else if (MutationObserver) { // H5的异步方法，监听Dom变化
  let observer = new MutationObserver(flush); // dom变化，会触发回调参数函数
  let textNode = document.createTextNode(1); // 创建文本
  observer.observe(textNode, {characterData: true}); // 观察文本的内容
  timerFunc = () => {
    textNode.textContent = 2; // 文本内容变化，会触发上面的observe监听
  }
} else if (setImmediate) { // ie浏览器支持的
  timerFunc = () => {
    setImmediate(flush);
  }
} else {
  timerFunc = () => {
    setTimeout(flush);
  }
}

export function nextTick(cb) {
  callback.push(cb);
  if (!pendding) {
    timerFunc();
    pendding = true;
  }
}